package com.atguigu.gmall.file;

import com.atguigu.gmall.model.product.SkuInfo;

import java.util.concurrent.*;

/**
 * @Author: 李旭
 * @Time: 14:40
 * @Description:
 *
 *     异步编排
 *       多线程 核心实现类   多线程复杂交互
 */
public class CompletableFutureDemo1 {


    public static void main(String[] args) throws Exception{

        //CompletableFuture   多线程交换实现类  异步编排
        //1:创建多线程  异步
  /*      CompletableFuture.runAsync(() -> {
            System.out.println(Thread.currentThread().getName());
        });*/
        //2:创建多线程   有返回值   异步
    /*    CompletableFuture<String> stringCompletableFuture = CompletableFuture.supplyAsync(() -> {
            System.out.println(Thread.currentThread().getName());
            return "haha";
        });*/
        //3:创建多线程
  /*      CompletableFuture<String> javaa = CompletableFuture.completedFuture("javaa");
        System.out.println(javaa.get());*/

       // System.out.println(stringCompletableFuture.get());
        //System.out.println(Thread.currentThread().getName());


        //4:计算完成时的回调方法 处理返回值 及异常
/*        CompletableFuture.supplyAsync(() -> {
                System.out.println(Thread.currentThread().getName());//第一个任务
                int i= 1/0;
                return 123;
        }).whenComplete((t,u) -> {//继续沿用上一个任务的线程
            //whenComplete 作用：第二个任务
            // 第二个任务依赖第一个任务  必须等待第一个任务执行完成
            // 第二个任务是收尾的任务
            //t: 是第一个任务的返回值
            //u: 是第一个任务的异常信息
            System.out.println("t:" + t);
            System.out.println("u:" + u);//对多线程出现问题 进行处理 降级处理
        }).whenCompleteAsync((t,u) -> {//去线程池获取新的线程
            //whenComplete 作用：第二个任务
            // 第二个任务依赖第一个任务  必须等待第一个任务执行完成
            // 第二个任务是收尾的任务
            //t: 是第一个任务的返回值
            //u: 是第一个任务的异常信息
            System.out.println("t:" + t);
            System.out.println("u:" + u);//对多线程出现问题 进行处理 降级处理
        }).exceptionally(u -> {
            System.out.println("u:" + u);
            return 123456;
        }).whenComplete((t,u) -> {

        });*/
        //5: 多线程串行
        CompletableFuture<Void> h1 = CompletableFuture.supplyAsync(() -> {
            System.out.println("5: 多线程串行 我是第一个任务：我是创建了一个线程");
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "123";
        }).thenApply((t) -> {
            System.out.println("thenApply接收上一个任务的返回值：t:" + t);
            //同时当前任务也有返回值
            return 456;
        }).thenAccept((t) -> {

            System.out.println("thenAccept接收上一个任务的返回值：t:" + t);
            //同时当前任务没有返回值
        }).thenRun(() -> {
            //当前任务不接收上一个任务的返回值  自己也没有返回值
            System.out.println("我只执行自己的程序即可");
        });
        //6:多线程并行
        CompletableFuture h2 = CompletableFuture.supplyAsync(() -> {
            System.out.println("6:多线程并行 我是第二个任务：我是创建了一个线程");
            return "111";
        });
        //等待上面二个线程执行完成
        CompletableFuture.allOf(h1,h2).join();
        System.out.println("等待上面二个线程执行完成");

    }

}
